﻿#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdlib.h>

int toBinary(int num, char* res, int len);

int main() {
	int num, bitCount;
	printf("输入要转换的十进制数: ");
	if (!scanf("%d", &num)) {
		printf("输入有误");
		return -1;
	}
	printf("转换后二进制数的位数: ");
	if (!scanf("%d", &bitCount)) {
		printf("输入有误");
		return -1;
	}
	char* res = (char*)malloc(bitCount + 1);
	if (toBinary(num, res, bitCount)) {
		printf("转换结果为: %s", res);
	} else {
		printf("二进制位数不足");
	}
	free(res);
	return 0;
}

/**
 * 整数转二进制字符串
 * @param num 要转换的整数
 * @param res 返回结果的字符数组指针，数组长度需要大于二进制位数，用于存储\0
 * @param len 转换后的二进制数的位数，不含\0
 * @return 转换成功返回1，数组长度不足导致转换失败返回0，失败时结果不可信
 */
int toBinary(int num, char* res, int len) {
	// 把num转为字符串存入temp
	char size = sizeof(num) * 8;
	char* temp = (char*)malloc(size + 1);
	if (!temp) return NULL;
	temp[size] = '\0';
	for (int i = size - 1; i >= 0; i--)
		temp[i] = (num >> (size - i - 1) & 1) + '0';
	if (len < size) {
		// 如果用于存储的空间位数小于数字占用的空间位数
		// 计算len位是否足以表达num
		for (int i = 0; i < size - len; i++) {
			if ((num >= 0 && temp[i] == '1') || (num < 0 && temp[i + 1] == '0')) {
				// 不足则释放temp，返回0
				free(temp);
				return 0;
			}
		}
		// 足够则修改res的值
		res[len] = '\0';
		for (int i = len - 1; i >= 0; i--) {
			res[i] = temp[i + size - len];
		}
	} else {
		// 如果用于存储的空间位数大于数字的空间位数
		res[len] = '\0';
		for (int i = len - 1; i >= 0; i--) {
			if (i >= len - size)
				res[i] = temp[i + size - len ];
			else
				// 正数补0，负数补1
				res[i] = num >= 0 ? '0' : '1';
		}
	}
	free(temp);
	return 1;
}